package controlador;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Usuario;
import modelo.io.ManejadorArchivos;
import modelo.servicio.Perfiles;
import modelo.servicio.Usuarios;

public class UsuarioControlador extends HttpServlet {

    private String accion;
//    private String usuario;
    private StringBuilder html;
    private static String direccionCarga;
    private static String carpetaTemporal;
    private static String usuarioCIFS;
    private static int tamanioBuffer;
    private static int numeroAnexos;
    private static boolean conCIFS;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        try {
            Properties prop = ManejadorArchivos.instancia().obtenerArchivoPropiedades("../conf.properties");
            direccionCarga = prop.getProperty("fs_directorio");
            carpetaTemporal = prop.getProperty("web_archivos_tmp");
            usuarioCIFS = prop.getProperty("fs_conexion");
            tamanioBuffer = Integer.parseInt(prop.getProperty("fs_tamanio_buffer"));
            numeroAnexos = Integer.parseInt(prop.getProperty("num_anexos"));
            conCIFS = prop.getProperty("conCIFS").equalsIgnoreCase("S");
        } catch (Exception ex) {
            throw new ServletException(ex);
        }
    }

    public static boolean isCIFS() {
        return conCIFS;
    }

    public static int getTamanioBuffer() {
        return tamanioBuffer;
    }

    public static String getDirectorioCarga() {
        return direccionCarga;
    }

    public static int getNumeroAnexos() {
        return numeroAnexos;
    }

    public static String getUsuarioCIFS() {
        return usuarioCIFS;
    }

    public static String getDirectorioTemporal() {
        return carpetaTemporal;
    }

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        html = new StringBuilder("");
        accion = request.getParameter("ac") != null
                ? request.getParameter("ac") : "";
        try {
            if (accion.compareToIgnoreCase("li") == 0) {
                getServletContext().getRequestDispatcher("/jsp/usuario/login.jsp").forward(request, response);
            } else if (accion.compareToIgnoreCase("lg") == 0) {
                validaSesion(request, response);
            } else if (accion.compareToIgnoreCase("lo") == 0) {
                request.getSession().invalidate();
                response.sendRedirect(getServletContext().getContextPath());
            } else if (accion.compareToIgnoreCase("op") == 0) {
                List<Usuario> usuarios = Usuarios.instancia().todos();
                generarOpcionesUsuario(usuarios);
            } else {
                response.sendRedirect(getServletContext().getContextPath());
            }
            out.println(html);
        } catch (Exception ex) {
            out.println(ex.getMessage());
        } finally {
            out.close();
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    public void validaSesion(HttpServletRequest request, HttpServletResponse response)
            throws DAOException {
        HttpSession session = request.getSession(true);
        String login, contrasena;
        login = request.getParameter("login") == null ? "" : request.getParameter("login");
        contrasena = request.getParameter("contrasena") == null ? "" : request.getParameter("contrasena");
        try {
            Usuario actual = Usuarios.instancia().obtener(login, contrasena);
            if (actual != null) {
                session.setAttribute("sUsuario", actual.getClave());
                session.setAttribute("sNombre", actual.getNombre());
                String menus = Perfiles.instancia().accesosMenu(actual.getClave());
                session.setAttribute("sMenu", menus);
                response.sendRedirect(getServletContext().getContextPath());
            } else {
                request.setAttribute("error", "Credenciales incorrectas");
                session.invalidate();
                getServletContext().getRequestDispatcher("/usu?ac=li").forward(request, response);
            }
        } catch (Exception ex) {
            request.setAttribute("error", ex.getMessage());
            try {
                getServletContext().getRequestDispatcher("/usu?ac=li").forward(request, response);
            } catch (Exception ex1) {
                request.setAttribute("error", ex.getMessage());
            }
        }
    }

    private void generarOpcionesUsuario(List<Usuario> usuarios) {
        if (!usuarios.isEmpty()) {
            html.append("<select name='cmb_usuario'>");
            for (Usuario user : usuarios) {
                html.append("<option value='").append(user.getClave()).append("'>");
                html.append(user.getClave()).append(" - ");
                if (user.getNombre().length() > 30) {
                    html.append(user.getNombre().substring(0, 30));
                } else {
                    html.append(user.getNombre());
                }
                html.append("</option>");
            }
            html.append("</select>");
        }
    }
}
